package cn.czxy.share.web.servlet;

import cn.czxy.domain.User;
import cn.czxy.share.dao.ShareDao;
import cn.czxy.share.domain.ShareFile;
import cn.czxy.share.service.ShareService;
import cn.czxy.utils.FileDataUtils2;
import cn.czxy.utils.FileTypeUtlis;
import cn.itcast.servlet.BaseServlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.List;

/**
 * @author shenghan
 * @version 1.0
 * @date 2019/4/13 0013
 */
public class ShareServlet extends BaseServlet {
    /**
     * ShareService对象 用于操作service层
     */
    private final ShareService ss = new ShareService();

    /**
     * 重写init方法,用于初始化DAO层的文件路径数据
     * @param config ServletConfig对象
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        //获取ServletContext对象
        ServletContext servletContext = config.getServletContext();
        //获取shareFiles的绝对路径
        ShareDao.xmlDir=servletContext.getRealPath("/")+"shareFiles/";
    }

    /**
     * 展示特定 userName 对应的已分享过的文件列表
     * 需从JSP传入 userName属性
     * @return 请求转发到share.jsp页面展示共享文件列表
     */
    public String shareFileList(){
        //Service层获取所有已分享过文件的用户列表
        List<String> nameList = ss.getSharedUlist();
        //将列表传回给jsp页面
        getSession().setAttribute("shareUlist",nameList);
        //获取jsp传入的userName
        String userName = getRequest().getParameter("userName");
        //Service层获取特定userName用户分享的文件的列表
        List<ShareFile> sfList =  ss.list(userName);
        //将ShareFile集合传回jsp
        getSession().setAttribute("sfList",sfList);
        return "forward:/share/share.jsp";
    }

    /**
     * 添加共享文件方法 从网盘文件的详细信息处入口
     * 需从JSP传入 fileName:文件的相对路径   user:session处的user
     * @return 请求转发给 杨永祥 文件详细信息页面
     * @throws UnsupportedEncodingException
     */
    public String addShareFile() throws UnsupportedEncodingException {
        //将从jsp上传入的fileName进行解码 (Tomcat7 与 Tomcat8 的差异)
        String fileName = URLDecoder.decode(getRequest().getParameter("fileName"),"utf-8");
        //将fileName拼接为一个绝对路径  从盘符到扩展名
        fileName = getServletContext().getRealPath("/"+fileName);
        //获取session中的user
        User user = (User) getSession().getAttribute("user");
        //调用service层的 添加共享文件方法 ,方法返回一个 ShareFile 对象,该对象封装了用户分享的这个文件的信息
        ShareFile sf = ss.addShareFile(fileName,user.getUserName());
        //请求转发
        return "forward:/file?method=findFlieByPath&path=/";
    }

    /**
     * 下载共享文件方法 从网盘详细信息 和 共享列表 处入口
     * 需从JSP传入 filePath 文件绝对路径(未编码) userLoginName 用户的登录名
     * @return
     */
    public String downLoadFile(){
        String path = getServletContext().getRealPath("/files");
        FileDataUtils2 fdu2 = new FileDataUtils2(path);
        String filePath = getRequest().getParameter("filePath");
        String userLoginName = getRequest().getParameter("userLoginName");
        //调用张原的下载方法
        boolean b = fdu2.downLoadFile(filePath, getRequest(), getResponse());
        //b为是否下载成功
        if (!b){
            return "forward:/share/error.jsp";
        }
//        System.out.println(b);
        return null;
    }

    /**
     * 展示共享文件的详细信息  从共享列表处入口
     * 需从JSP传入 fileName: 文件相对路径 en_filePath:编码后的文件绝对路径
     * @return 请求转发到shareShow展示共享文件的详细信息
     * @throws UnsupportedEncodingException
     */
    /*public String viewFile() throws UnsupportedEncodingException {
        //获取JSP传入的两个参数
        String fileName = getRequest().getParameter("fileName");
        String en_filePath = getRequest().getParameter("en_filePath");
        //解码绝对路径
        en_filePath = URLDecoder.decode(en_filePath, "utf-8");
        //调用其他模块的方法获取几个shareShow.jsp的必需参数
        String type = FileTypeUtlis.getFileType(en_filePath);
        String name = FileTypeUtlis.getFileName(en_filePath);
        String typeName = FileTypeUtlis.getTypeName(en_filePath);
        getRequest().setAttribute("typeName",typeName);
        getRequest().setAttribute("fileName",name);
        getRequest().setAttribute("type",type);
        return "forward:/demand/shareShow.jsp";
    }*/
    //new 杨永信 修改后的代码
    public String viewFile() throws UnsupportedEncodingException{
        /**
         * 等待和杨永祥对接
         */
        String fileName = getRequest().getParameter("fileName");
        String en_filePath = getRequest().getParameter("en_filePath");
        en_filePath = URLDecoder.decode(en_filePath, "utf-8");
        String name = FileTypeUtlis.getFileName(en_filePath);
        /*
        start
         */
        boolean exists = new File(en_filePath).exists();
        if (!exists) {
            return "forward:/share/error.jsp";
        }
        /*
        end
         */
        /*
        杨永信修改,这些是无用代码
         */
        //String type = FileTypeUtlis.getFileType(en_filePath);
        //String typeName = FileTypeUtlis.getTypeName(en_filePath);
//        getRequest().setAttribute("typeName",typeName);
//        getRequest().setAttribute("fileName",name);
//        getRequest().setAttribute("type",type);
        //System.out.println("aa");
        /*
        杨永信 修改 位置 调用我的 方法
         */
        return "forward:/file?method=showFile&fileName="+name+"&flag=share";
    }


    /**
     * 创建私密共享文件   从网盘文件详细信息处入口
     * 需从JSP传入 fileName 文件相对路径
     * @return
     */
    public String creatPersonalShareFile(){
        //获取session中的user对象
        User user = (User) getSession().getAttribute("user");
        //获取JSP传入的fileName
        String fileName = getRequest().getParameter("fileName");
        //获取路径最后一个 / 或 \ 的索引
        int index = fileName.lastIndexOf("\\")==-1?fileName.lastIndexOf("/"): fileName.lastIndexOf("\\");
        //此处用于后期添加私密文件有效时间
//        Long lt = Long.parseLong(getRequest().getParameter("liveTime"));
        //未添加有效时间时  固定为7天
        Long lt=1000*60*60*24*7L;
        //根据JSP传入的参数创建一个ShareFile对象
        ShareFile sf = new ShareFile(user.getUserName(), System.currentTimeMillis(),lt,fileName.substring(index+1), getServletContext().getRealPath(fileName));
        //调用Service层的生成随机8位口令的方法
        String address = ss.addPersonalShareFile(sf);
        //将口令address传回前端
        getRequest().setAttribute("address",address);
        //调用其他模块的方法获取type属性
        String type = FileTypeUtlis.getFileType(fileName);
        //编码
        try {
            fileName = URLEncoder.encode(fileName,"utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        /**
         * 待添加
         */
        return "forward:/file?method=showFile&fileName="+fileName+"&id="+type+"&address="+address;
    }

    /**
     * 通过口令展示共享文件的详细信息
     * 需要从JSP传入口令address
     * @return
     * @throws UnsupportedEncodingException
     */
    /*public String viewPersonalShareFile() throws UnsupportedEncodingException {
        String address = getRequest().getParameter("address");
        //调用service层寻找口令对应的ShareFile对象,找不到或文件过期返回null
        ShareFile sf = ss.findPersonalShareFile(address);
        if (sf == null) {
            return "forward:/share/error.jsp";
        }else{
            String fileName = sf.getFilePath();
            String type = FileTypeUtlis.getFileType(fileName);
            String name = FileTypeUtlis.getFileName(fileName);
            String typeName = FileTypeUtlis.getTypeName(fileName);

            getRequest().setAttribute("typeName",typeName);
            getRequest().setAttribute("fileName",name);
            getRequest().setAttribute("type",type);

            return "forward:/demand/shareShow.jsp";
        }
    }*/
    //new 杨永信 修改
    public String viewPersonalShareFile() throws UnsupportedEncodingException {
        String address = getRequest().getParameter("address");
        ShareFile sf = ss.findPersonalShareFile(address);
        if (sf == null) {
            return "forward:/share/error.jsp";
        }else if(!new File(sf.getFilePath()).exists()){
            return "forward:/share/error.jsp";
        }else{
            String fileName = sf.getFilePath();

            String name = FileTypeUtlis.getFileName(fileName);

            getRequest().setAttribute("flag",true);
//            String typeName = FileTypeUtlis.getTypeName(fileName);
//            String type = FileTypeUtlis.getFileType(fileName);
//            getRequest().setAttribute("typeName",typeName);
//            getRequest().setAttribute("fileName",name);
//            getRequest().setAttribute("type",type);
//            杨永信 修改 位置 调用我的 方法

            return "forward:/file?method=showFile&fileName="+name+"&flag=share";
        }
    }
    //删除共享文件  尚未实现
    public String deleteShareFile(){
        String filePath = getRequest().getParameter("filePath");
        String userLoginName = getRequest().getParameter("userLoginName");
        boolean b = ss.deleteShareFile(filePath,userLoginName);
        return "forward:/file?method=findFlieByPath&path=/";
    }


    /**
     * 测试方法
     */
    /*public String test_addUserSession(){
        User test = new User("test");
        getRequest().getSession().setAttribute("user",test);
        return null;
    }*/


}
